package com.bjpowernode.queue;

import java.util.Arrays;

/**
 * @ClassName Queue
 * @Description TODO crete queue class by array
 *                   rear 初始值为 -1，随着数据输入而改变，指向队列最后的元素（包含）
 *                   font 初始值为 -1，随着数据输出而改变，指向队列最前面的元素（不包含）
 * @date 2021/9/16 10:48
 * @Author ZY
 */
public class Queue {
    private int front = -1; // 前端指针
    private int rear = -1; // 后端指针
    private int maxSize; // 最大容量
    private int[] dataStore; // 用于数据存储的数组

    public Queue() {
    }

    public Queue(int maxSize) {
        this.maxSize = maxSize;
        dataStore = new int[maxSize];
    }

    public int getFront() {
        return front;
    }

    public void setFront(int front) {
        this.front = front;
    }

    public int getRear() {
        return rear;
    }

    public void setRear(int rear) {
        this.rear = rear;
    }

    @Override
    public String toString() {
        String ret = "";
        ret += "[";
        for (int i : dataStore) {
            ret = ret + i + ",";
        }
        if (ret.endsWith(",")){
            ret = ret.substring(0,ret.length()-1);
        }

        ret+="]";
        return ret;
    }

    /**
     * 往队列中添加元素 —— 当 rear == maxSize -1 的时候，再添加元素进去则会失败
     * @param element 添加的元素
     * @return 添加是否成功 true为成功
     */
    public boolean add(int element){
        if (rear == maxSize -1){
            System.out.println("队列已满，存入数据失败！~");
            return false;
        }
        rear ++;
        dataStore[rear] = element;
        return true;
    }

    /**
     * 遵循先进先出原则，从数组头部开始取数据，当 front == rear，队列清空，再取元素则会得到 null
     * @return
     */
    public Integer get(){
        if (front == rear){
            System.out.println("队列数据为空，取出数据失败！~");
            return null;
        }
        front ++;
        int copy = dataStore[front];
        dataStore[front] = 0;
        if (front == rear){
            front = -1;
            rear = -1;
        }
        return copy;
    }
}
